jump game (横スクロール)
授業内で扱った技術だけでコードが動くように以下書き直したやつ
code:jump_game.py
import pyxel
import random
class App:
def __init__(self):
pyxel.init(160, 120, caption="Pyxel Jump")
# ゲームのスコア管理
self.score = 0
# キャラクターのx,y座標と移動ベクトル、生死判定
self.player_x = 72
self.player_y = -16
self.player_vy = 0
self.player_is_alive = True
# 床オブジェクトを管理する配列
self.floor = []
for i in range(4):
# 1つ目の値 = 床のx座標
# 2つ目の値 = 床のy座標
# 3つ目の値 = 床がまだ踏まれていないか
pyxel.run(self.update, self.draw)
def update(self):
if pyxel.btnp(pyxel.KEY_Q):
pyxel.quit()
self.update_player()
for i in range(0, len(self.floor)):
self.floori = self.update_floor( self.floori0, self.floori1, self.floori2) def update_floor(self, x, y, is_active):
if is_active:
if (
self.player_x + 16 >= x
and self.player_x <= x + 40
and self.player_y + 16 >= y
and self.player_y <= y + 8
and self.player_vy > 0 # 落ちている途中か?
): # プレイヤーと床が接触したら
is_active = False
self.score += 10
self.player_vy = -12
pyxel.play(3, 3)
else:
# すでに死んだ床ならば落ちていく
y += 6
# 床は左方向に流し続ける
x -= 4
# 床が画面の左端まで来てしまったら
if x < -40:
x += 240 # 画面の右端に床を戻し
y = random.randint(8, 104) # y座標をランダムで設定しなおし
is_active = True # 床を復活させる
def update_player(self):
if pyxel.btn(pyxel.KEY_LEFT):
self.player_x = max(self.player_x - 2, 0)
# どれだけ左端に行ってもxは0より小さくならないようにする
if pyxel.btn(pyxel.KEY_RIGHT):
self.player_x = min(self.player_x + 2, pyxel.width - 16)
# どれだけ右端に行ってもxは画面の端-16px (=キャラクターの大きさ)より大きくならないようにする
# キャラクターを上下方向に移動する
self.player_y += self.player_vy
# 移動ベクトルの見直し
# ジャンプして上方向に移動する時のvyはマイナス、下に落ちる時はプラス値
# self.player_vy + 1 → 下方向に常に1の重力加速度を加えている
# minをつけることで、下方向への移動速度が8以上にならないようにしている
self.player_vy = min(self.player_vy + 1, 8)
if self.player_y > pyxel.height:
# キャラクターを死亡判定
if self.player_is_alive:
self.player_is_alive = False
pyxel.play(3, 5)
# 画面の高さは200でしかないが、600までは落とし続ける
# 死んだあとに落とし続けることで復活までの猶予時間を擬似的に演出している
if self.player_y > 600:
self.score = 0
self.player_x = 72
self.player_y = -16
self.player_vy = 0
self.player_is_alive = True
def draw(self):
pyxel.cls(12)
# draw player
pyxel.rect(self.player_x, self.player_y, 16, 16, 0)
for i in range(0, len(self.floor)):
pyxel.rect(self.floori0, self.floori1, 40, 8, 7) # draw score
self.score = 0
s = "SCORE {:>4}".format(self.score)
pyxel.text(5, 4, s, 1)
pyxel.text(4, 4, s, 7)
App()